/*
增加C语言的清屏函数，每次到提示： "请输入（1 ~ 10）之前的四个数  的时候都进行清屏
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <string>
#include <stdlib.h>
#define INF 24

using namespace std;

/// 用来存储两个数的计算结果和计算的过程
struct data
{
    /// 记录两个位置运算的结果
    int sum;
    /// 记录两个位置
    int x;
    int y;
    /// 记录两个数计算的符号
    char str;
} pre[50];
/// 存储输入的四个数
int a[4];
char s[4] = {'+', '-', '*', '/'};
string str[50];
int n;
bool flag;

void Init()///预处理
{
    n = 0;
    memset(a, 0, sizeof(a));
    for(int i = 0; i < 4; i ++)
        cin >> a[i];

    /// 用来判断是否已经输出
    flag = 0;
}

/*
对满足结果是24的情况进行处理
把之前没有出现过的式子都放在str数组中，每次计算的结果都依次进行和str数组中的数据进行比较
如果出现，则不需要输出
否则，存入到str数组中
*/
bool to_change(int ww, char aa, int xx, char bb, int yy, char cc, int zz)
{
    string ss;
    if(ww == 0)
        ss += ww + '0';
    else
        while(ww != 0)
        {
            ss += ww % 10 + '0';
            ww /= 10;
        }
    ss += aa;
    if(xx == 0)
        ss += xx + '0';
    else
        while(xx != 0)
        {
            ss += xx % 10 + '0';
            xx /= 10;
        }

    ss += bb;
    if(yy == 0)
        ss += yy + '0';
    else
        while(yy != 0)
        {
            ss += yy % 10 + '0';
            yy /= 10;
        }
    ss += cc;
    if(zz == 0)
        ss += zz + '0';
    else
        while(zz != 0)
        {
            ss += zz % 10 + '0';
            zz /= 10;
        }
    for(int i = 0; i < n; i ++)
        if(str[i] == ss)
            return 1;
    /// 之前输出的情况中不存在当前的情况，则存入str数组中，返回0
    str[n ++] = ss;
    return 0;
}

int main()
{
    printf("是否进入24点游戏：Y/y | N/n？？\n");
    char c;
    while(cin >> c)
    {

        if(c == 'Y' || c == 'y')
        {
            system("cls");
            printf("请输入（1 ~ 10）之前的四个数\n");
        }

        else if(c == 'N' || c == 'n')
        {
            ///退出游戏
            break;
        }
        else
        {
            printf("输入错误，请重新输入！！！\n");
            printf("是否进入24点游戏：Y/y | N/n？？\n");
            continue;
        }

        Init();

        int num = 0;
        for(int i = 0; i < 4; i ++)
            for(int j = 0; j < 4; j ++)
            {
                /// 上面是取出两个数

                if(i == j)
                    continue;
                /// 进行四种符号的选择
                for(int k = 0; k < 4; k ++)
                {
                    /// 每次都把对应的计算结果，取的两个数在a数组中的位置以及运算的符号都保存到结构体中
                    if(s[k] == '+')
                    {
                        pre[num].sum = a[i] + a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '+';
                    }
                    else if(s[k] == '-')
                    {
                        pre[num].sum = a[i] - a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '-';
                    }
                    else if(s[k] == '*')
                    {
                        pre[num].sum = a[i] * a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '*';
                    }
                    else if(s[k] == '/')
                    {
                        /// 注意分母不能为0
                        if(a[j] == 0)
                            continue;
                        /// 两个数相除的余数必须为0
                        if(a[i] % a[j] != 0)
                            continue;
                        pre[num].sum = a[i] / a[j];
                        pre[num].x = i;
                        pre[num].y = j;
                        pre[num ++].str = '/';
                    }
                }
            }

        for(int i = 0; i < num; i ++)
            for(int j = 0; j < num; j ++)
            {
                if(i == j)
                    continue;
                /// 判断是否一个数被多次使用
                if(pre[i].x != pre[j].x && pre[i].x != pre[j].y && pre[i].y != pre[j].x && pre[i].y != pre[j].y)
                {
                    for(int k = 0; k < 4; k ++)
                    {
                        if(s[k] == '+')
                        {
                            int sum = pre[i].sum + pre[j].sum;
                            if(sum == INF)
                            {
                                /// to_change用来判断当前的这种情况是否已经输出
                                if(!to_change(a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y]))
                                {
                                    printf("%d %c %d %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    /// 记录存在结果为24的情况
                                    flag = 1;
                                }
                            }
                        }
                        else if(s[k] == '-')
                        {
                            int sum = pre[i].sum - pre[j].sum;
                            if(sum == INF)
                            {
                                if(!to_change(a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y]))
                                {
                                    printf("%d %c %d %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    /// 记录存在结果为24的情况
                                    flag = 1;
                                }
                            }
                        }
                        /// 如果是乘除的时候要进行判断两端计算的是否是加减，是的话要加括号
                        else if(s[k] == '*')
                        {
                            int sum = pre[i].sum * pre[j].sum;
                            if(sum == INF)
                            {
                                if(!to_change(a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y]))
                                {
                                    if((pre[i].str == '+' || pre[i].str == '-') && (pre[j].str == '+' || pre[j].str == '-'))
                                        printf("(%d %c %d) %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    else if(pre[i].str == '+' || pre[i].str == '-')
                                        printf("(%d %c %d) %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    else if(pre[j].str == '+' || pre[j].str == '-')
                                        printf("%d %c %d %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    flag = 1;
                                }

                            }
                        }
                        else if(s[k] == '/')
                        {

                            if(pre[j].sum == 0)
                                continue;
                            if(pre[i].sum % pre[j].sum != 0)
                                continue;
                            int sum = pre[i].sum / pre[j].sum;
                            if(sum == INF)
                            {
                                if(!to_change(a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y]))
                                {
                                    if((pre[i].str == '+' || pre[i].str == '-') && (pre[j].str == '+' || pre[j].str == '-'))
                                        printf("(%d %c %d) %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    else if(pre[i].str == '+' || pre[i].str == '-')
                                        printf("(%d %c %d) %c %d %c %d = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    else if(pre[j].str == '+' || pre[j].str == '-')
                                        printf("%d %c %d %c (%d %c %d) = %d\n", a[pre[i].x], pre[i].str, a[pre[i].y], s[k], a[pre[j].x], pre[j].str, a[pre[j].y], INF);
                                    flag = 1;
                                }
                            }
                        }
                    }
                }
            }

        if(!flag)
            printf("不存在\n");
        printf("请选择是否继续：Y/y | N/n？？\n");
    }
    return 0;
}
